/**
 * 敏感内容过滤服务
 * 负责处理消息中的敏感数据，如电话号码、信用卡号、身份证号等
 */

const config = require('../config');
const { Setting } = require('../models');
const logger = require('../utils/logger');
const sensitiveContentUtils = require('../utils/sensitiveContentUtils');

// 默认配置
const defaultSettings = {
  // 号码掩码相关
  enableNumberMasking: true,
  numberMaskingPattern: '###****##',
  
  // 敏感数字检测相关
  enableLongNumberDetection: true,
  longNumberThreshold: 8,
  detectCreditCards: true,
  detectPhoneNumbers: true,
  
  // 图片过滤相关
  enableImageFiltering: true,
  imageFilteringLevel: 'medium', // low, medium, high
  
  // 其他设置
  storeOriginalContent: true,
  notifyAdminOnDetection: true,
  
  // 敏感数字模式
  numberPatterns: [
    '\\d{13,19}', // 信用卡号
    '\\d{1,3}[-. ]?\\d{3,4}[-. ]?\\d{4}', // 电话号码
    '\\d{15,18}[0-9Xx]' // 身份证号
  ],
  
  // 敏感关键词
  sensitiveKeywords: [
    '身份证',
    '信用卡',
    '银行卡',
    '密码',
    '账号'
  ]
};

// 当前设置
let currentSettings = { ...defaultSettings };

/**
 * 初始化过滤服务
 */
const initialize = async () => {
  try {
    // 从数据库加载设置
    // 使用SQL的方式查询
    const settings = await Setting.findOne({ 
      where: { key: 'sensitiveContentFilter' }
    });
    
    if (settings && settings.value) {
      try {
        const parsedValue = JSON.parse(settings.value);
        currentSettings = { ...defaultSettings, ...parsedValue };
        logger.info('已从数据库加载敏感内容过滤设置');
      } catch (parseError) {
        logger.error('解析敏感内容过滤设置出错:', parseError);
        // 使用默认设置
      }
    } else {
      // 如果没有找到设置，则创建默认设置
      try {
        await Setting.create({
          key: 'sensitiveContentFilter',
          value: JSON.stringify(defaultSettings),
          description: '敏感内容过滤设置'
        });
        logger.info('已创建默认敏感内容过滤设置');
      } catch (createError) {
        logger.error('创建默认敏感内容过滤设置出错:', createError);
      }
    }
    
    logger.info('敏感内容过滤服务已初始化');
    return true;
  } catch (error) {
    logger.error('初始化敏感内容过滤服务失败:', error);
    return false;
  }
};

/**
 * 获取当前过滤设置
 */
const getSettings = () => {
  return { ...currentSettings };
};

/**
 * 更新过滤设置
 * @param {Object} newSettings 新的设置
 */
const updateSettings = async (newSettings) => {
  try {
    const mergedSettings = { ...currentSettings, ...newSettings };
    
    // 使用SQL方式更新设置
    const [setting, created] = await Setting.upsert({
      key: 'sensitiveContentFilter',
      value: JSON.stringify(mergedSettings),
      description: '敏感内容过滤设置'
    });
    
    // 更新当前设置
    currentSettings = mergedSettings;
    
    logger.info('敏感内容过滤设置已更新');
    return { success: true };
  } catch (error) {
    logger.error('更新敏感内容过滤设置失败:', error);
    return { success: false, error: error.message };
  }
};

/**
 * 掩码电话号码
 * @param {string} phoneNumber 完整电话号码
 * @returns {string} 掩码后的电话号码
 */
const maskPhoneNumber = (phoneNumber) => {
  if (!phoneNumber) return '未知';
  
  // 如果禁用了号码掩码，返回原始号码
  if (!currentSettings.enableNumberMasking) {
    return phoneNumber;
  }
  
  // 使用设置的模式进行掩码
  const pattern = currentSettings.numberMaskingPattern || '###****##';
  
  // 如果号码长度不够，则直接返回
  if (phoneNumber.length <= 5) {
    return phoneNumber;
  }
  
  // 根据模式替换
  let result = '';
  let phoneIndex = 0;
  
  for (let i = 0; i < pattern.length && phoneIndex < phoneNumber.length; i++) {
    if (pattern[i] === '#') {
      // 显示原始数字
      result += phoneNumber[phoneIndex++];
    } else if (pattern[i] === '*') {
      // 掩码
      result += '*';
      phoneIndex++;
    } else {
      // 其他字符直接保留
      result += pattern[i];
    }
  }
  
  // 如果电话号码还有剩余部分，用*代替
  while (phoneIndex < phoneNumber.length) {
    result += '*';
    phoneIndex++;
  }
  
  return result;
};

/**
 * 检测敏感数字
 * 使用共享工具函数
 */
const detectSensitiveNumbers = (text) => {
  return sensitiveContentUtils.detectSensitiveNumbers(text, currentSettings);
};

/**
 * 检测敏感关键词
 * 使用共享工具函数
 */
const detectSensitiveKeywords = (text) => {
  return sensitiveContentUtils.detectSensitiveKeywords(text, currentSettings.sensitiveKeywords);
};

/**
 * 检测消息中的敏感内容
 * @param {string} text 待检查的文本
 * @returns {object} 检测结果 { hasSensitiveContent, type, matches }
 */
const detectSensitiveContent = (text) => {
  return sensitiveContentUtils.detectSensitiveContent(text, currentSettings);
};

/**
 * 过滤敏感内容
 * @param {string} text 原始文本
 * @returns {object} 过滤结果 { filteredText, hasSensitiveContent }
 */
const filterSensitiveContent = (text) => {
  return sensitiveContentUtils.filterSensitiveContent(text, currentSettings);
};

/**
 * 图片内容过滤
 * @param {Buffer|string} imageData 图片数据或图片路径
 * @returns {object} 是否包含敏感内容
 */
const filterImageContent = async (imagePath) => {
  // 由于这个功能可能需要第三方服务，这里简化处理
  // 在实际项目中可能需要集成图像识别API
  logger.debug('图片内容过滤被调用', { path: imagePath });
  
  return {
    hasSensitiveContent: false,
    reasons: [],
    filterLevel: currentSettings.imageFilteringLevel
  };
};

module.exports = {
  initialize,
  getSettings,
  updateSettings,
  maskPhoneNumber,
  detectSensitiveContent,
  filterSensitiveContent,
  filterImageContent
}; 